package base_grammar

/*
	变量
*/
import (
	"fmt"
	"tools_go/basic_learn/morestrings"

	"github.com/google/go-cmp/cmp"
)

func variable_f1() {
	// 变量声明
	/* var name string
	var age int
	var b bool */

	var (
		// 声明时赋值
		name string = "zhoujl"
		age  int
		b    bool
	)

	fmt.Printf("name: %v\n", name)
	fmt.Printf("age: %v\n", age)
	fmt.Printf("b: %v\n", b)

	age = 11
	b = true

	fmt.Printf("name: %v\n", name)
	fmt.Printf("age: %v\n", age)
	fmt.Printf("b: %v\n", b)

	// 类型推断
	var sex = "man"
	fmt.Printf("sex: %v\n", sex)

	var rate float32 = 0.89
	fmt.Printf("rate: %v\n", rate)

	// 批量初始化
	var a, d, c = "1", 20, false
	fmt.Printf("a: %v\n", a)
	fmt.Printf("b: %v\n", d)
	fmt.Printf("c: %v\n", c)

	// 短变量声明 只能声明在function中  不能在外部使用  外部只能规范定义
	school := "cslg"
	// 等价于  var school string = "cslg" 或者 var school = "cslg"
	// 此用法限制在只能用于函数内部
	vip := true
	fmt.Printf("school: %v\n", school)
	fmt.Printf("vip: %v\n", vip)

	// 匿名变量  后面没有使用的变量 用_
	// 匿名变量：1. 不分配内存不占用空间 2. 不需要命名 3. 多次声明不会有问题
	email, _ := getEmailAndType()
	fmt.Printf("email: %v\n", email)

	// 使用其它自定义包
	fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))

	fmt.Println(cmp.Diff("Hello World", "Hello Go"))

}

func variable_f2() {
	height, weight := 180, 100
	// 变量交换
	height, weight = weight, height
	fmt.Printf("heitgh: %v\n", height)
	fmt.Printf("weight: %v\n", weight)

	// 指针变量
	heightPtr := &height
	fmt.Printf("heitghPtr: %v\n", heightPtr)

	i := new(int)
	fmt.Println("i address:", i)
	fmt.Println("i value:", *i)
}

func newInt() *int {
	return new(int)
}

func newInt2() *int {
	// 与newInt等价
	var dummy int
	return &dummy
}

// 匿名变量
func getEmailAndType() (string, int) {
	return "1002587665@qq.com", 1
}

func getEmailAndType2() (email string, sort int) {
	return "1002587665@qq.com", 1
}
